#include "CarStop.h"
#include <iostream>

// 两个栈实现一个队列
class MyQueue
{
public:
    using ElementType = LinkStack::ElementType;
    void Push(const void *&element) // 进来的时候只有s1有数据  保证两个只有一个有数据
    {
        while (s2.IsEmpty() == false)
        {
            s1.Push(*s2.GetTop());
            s2.Pop();
        }
        s1.Push(element);
    }
    void Pop() // 出去的时候保证s2只有数据
    {
        while (s1.IsEmpty() == false)
        {
            s2.Push(*s2.GetTop());
            s1.Pop();
        }
        s2.Push(element);
    }

    ElementType *GetFront()
    {
        while (s1.IsEmpty() == false)
        {
            s2.Push(s1.GetTop());
            s1.Pop();
        }
        return s2.GetTop();
    }

    bool IsEmpty()
    {
        return s1.IsEmpty() && s2.IsEmpty();
    }

private:
    LinkStack s1;
    LinkStack s2;
};

// 两个队列实现一个栈
// class MyStack
// {
// public:
//     using ElementType = LinkStack::ElementType;
//     void Push(const ElementType &element) // 进来的时候只有s1有数据  保证两个只有一个有数据
//     {
//         while (q2.IsEmpty() == false)
//         {
//             q1.Push(*q2.GetFront());
//             q2.Pop();
//         }
//         q1.Push(element);
//     }
//     void Pop()
//     {
//         while (q1.Size() > 1)
//         {
//             q2.Push(*q1.GetFront());
//             q1.Pop();
//         }
//         q1.Pop();
//         while (q2.IsEmpty() == false)
//         {
//             q1.Push(*q2.GetFront());
//             q2.Pop();
//         }
//     }

//     ElementType *GetTop()
//     {
//         while (q1.Size() > 1)
//         {
//             q2.Push(*q1.GetFront());
//             q1.Pop();
//         }
//         ElementType r = *q1.GetFront();
//         while (q2.IsEmpty() == false)
//         {
//             q1.Push(*q2.GetFront());
//             q2.Pop();
//         }
//         return r;
//     }
//     bool IsEmpty()
//     {
//         return q1.IsEmpty() && q2.IsEmpty();
//     }
// private:
//     LinkQueue q1;
//     LinkQueue q2;
// };

int main()
{
    CarStop s(3);
    while (1)
    {
    //     s.show();
    //     std::cout << "1.车辆进入停车场";
    //     std::cout << "2.车辆离开停车场";
    //     std::cout << "3.退出\n";

    //     int choice = 0;
    //     std::cin >> choice;
    //     switch (choice)
    //     {
    //     case 1:
    //         s.ComeCar();
    //         break;
    //     case 2:
    //         s.LeaveCar();
    //         break;
    //     case 3:
    //         return 0;
    //     default:
    //         break;
    //     }
    // }

    MyQueue q;
    for (long i = 1; i <= 10; i++)
    {
        q.Push((void *)i);
    }
    while (q.IsEmpty() == false)
    {
        std::cout << (long)*q.GetFront() << " ";
        q.Pop();
    }
    std::cout << std::endl;

    // MyStack s;
    // for (long i = 1; i <= 10; i++)
    // {
    //     q.Push((void *)i);
    // }
    // while (q.IsEmpty() == false)
    // {
    //     std::cout << (long)*q.GetFront() << " ";
    //     q.Pop();
    // }
    // std::cout << std::endl;
}
